home *** CD-ROM | disk | FTP | other *** search
/ Fraggle Rock Season 1 Bonus CD / Fraggle Rock Season 1 Bonus CD.iso / pc / FraggleRock.exe / FraggleRock.dxr / Internal_3_Push Button.ls < prev    next >
Encoding:
Text File  |  2005-06-24  |  12.5 KB  |  301 lines

  1. property spriteNum, mySprite, myMember, myStandardMember, myRollovermember, myMouseDownMember, myDisabledMember, myMouseDownSound, myMouseUpSound, myActiveFlag, myXRayFlag, myMessageType, myMessage, theMouseWasUp, myMouseDown, myRollover, mySubscribersList
  2.  
  3. on getBehaviorDescription me
  4.   return "PUSH BUTTON" & RETURN & RETURN & "This behavior sets the member of a sprite depending on the state of the mouse (elsewhere, rollover, mouseDown, mouseUp)." & RETURN & RETURN & "This creates a button which can either initiate actions in other sprites, or provide visual feedback for other behaviors attached to the same sprite." & RETURN & RETURN & "The behavior can be enabled or disabled, using a #PushButton_ToggleActive call to the behavior or the sprite." & RETURN & RETURN & "Two messaging systems are provided:" & RETURN & "1) A custom message can sent whenever the Push Button behavior is activated. " & "This message can be sent to a Movie Script handler, all sprites, or the actorList. " & "The message can also be suppressed." & RETURN & RETURN & "2) Objects can 'subscribe' to the behavior in order to receive PushButton_Activated, _Enabled and _Disabled messages. " & "A two-way messaging system allows for cleaning up object references before an object is destroyed." & RETURN & RETURN & "The behavior can be set to consider that all sprites in higher channels either block or let through all mouse events. " & "If mouse events are allowed to pass, you can place blended sprites above the button to change its color. " & "If mouse events are blocked, such translucent sprites provide an alternative method for disabling the button." & RETURN & RETURN & "PERMITTED MEMBER TYPES" & RETURN & "[#bitmap, #filmLoop, #flash, #movie, #picture, #quickTimeMedia, #shape, #vectorShape]" & RETURN & RETURN & "PARAMETERS:" & RETURN & "* Standard member (when mouse is elsewhere)" & RETURN & "* Rollover member" & RETURN & "* MouseDown member" & RETURN & "* Disabled member" & RETURN & RETURN & "Optional parameters:" & RETURN & "* MouseDown sound" & RETURN & "* MouseUp sound" & RETURN & "If members are placed consecutively in the cast in this order then default values can be used to create the button." & RETURN & RETURN & "* Do sprites above the button allow mouse events through?" & RETURN & "* Type of message sent on mouseUp: do | sendAllSprites | call the actorList | no action" & RETURN & "* Custom Message sent on mouseUp" & RETURN & RETURN & "NOTES:" & RETURN & "If you use 'do', be sure that you have a handler in a Movie Script that corresponds to the message sent." & RETURN & RETURN & "If you indicate 'no action' then this behavior will simply deal with the different states of the button. " & "You can still execute an action on mouseUp by one of two means:" & RETURN & "1) Add a behavior with a mouseUp handler to the same sprite (for example, the 'Jump Back Button' behavior" & RETURN & "2) Subscribe an object to the current behavior. " & " The object will then receive your Custom Message directly."
  5. end
  6.  
  7. on getBehaviorTooltip me
  8.   return "Use with graphic members." & RETURN & RETURN & "Swaps the member of the sprite according to the state of the mouse. " & "You can use this dynamic button behavior to play a brief sound on mouseDown and/or mouseUp, send out a custom message of your choice, and trigger actions of other sprites. " & "You can also use it to provide visual feedback for other behaviors on the same sprite (for example, Jump to Marker Button). " & "This behavior can also interact with custom objects."
  9. end
  10.  
  11. on beginSprite me
  12.   Initialize(me)
  13. end
  14.  
  15. on exitFrame me
  16.   if myActiveFlag then
  17.     CheckForRollover(me)
  18.   end if
  19. end
  20.  
  21. on endSprite me
  22.   call(#PushButton_ClosingDown, mySubscribersList, me, spriteNum, myMessage)
  23.   mySubscribersList.deleteAll()
  24. end
  25.  
  26. on Initialize me
  27.   mySprite = sprite(me.spriteNum)
  28.   myMember = mySprite.member
  29.   myMouseDownSound = member("click")
  30.   repeat while the last char in myMessage = SPACE
  31.     delete char -30000 of myMessage
  32.   end repeat
  33.   if not ["do", "no action"].getPos(myMessageType) then
  34.     if myMessage contains SPACE then
  35.       ErrorAlert(me, #spaceInMessage, myMessage)
  36.     else
  37.       myMessage = symbol(myMessage)
  38.     end if
  39.   end if
  40.   myActiveFlag = myActiveFlag = "Active"
  41.   myXRayFlag = myXRayFlag = "let all mouse events through"
  42.   myStandardMember = value(myStandardMember)
  43.   myRollovermember = value(myRollovermember)
  44.   myMouseDownMember = value(myMouseDownMember)
  45.   myDisabledMember = value(myDisabledMember)
  46.   myMouseDownSound = value(myMouseDownSound)
  47.   myMouseUpSound = value(myMouseUpSound)
  48.   if myActiveFlag then
  49.     myMember = myStandardMember
  50.     mySprite.member = myMember
  51.   else
  52.     myMember = myDisabledMember
  53.     mySprite.member = myMember
  54.   end if
  55.   mySubscribersList = []
  56.   sendAllSprites(#PushButton_OpenForBusiness, mySubscribersList, me, spriteNum, myMessage)
  57. end
  58.  
  59. on CheckForRollover me
  60.   mouseOverMe = rollover(spriteNum)
  61.   if mouseOverMe then
  62.     if not myXRayFlag then
  63.       mouseOverMe = the mouseMember = myMember
  64.     end if
  65.   end if
  66.   if myRollover = mouseOverMe then
  67.     if theMouseWasUp = the mouseUp then
  68.       exit
  69.     else
  70.       theMouseWasUp = the mouseUp
  71.       if mouseOverMe then
  72.         if the mouseUp then
  73.           if myMouseDown then
  74.             Activate(me)
  75.           else
  76.             myMember = myRollovermember
  77.             mySprite.member = myMember
  78.           end if
  79.         else
  80.           clickOn(me)
  81.         end if
  82.       else
  83.         if the mouseUp then
  84.           if myMouseDown then
  85.             Disactivate(me)
  86.           end if
  87.         end if
  88.       end if
  89.     end if
  90.   else
  91.     myRollover = mouseOverMe
  92.     if myMouseDown then
  93.       if myRollover then
  94.         myMember = myMouseDownMember
  95.         mySprite.member = myMember
  96.       else
  97.         myMember = myStandardMember
  98.         mySprite.member = myMember
  99.       end if
  100.     else
  101.       if not (the mouseDown) and myRollover then
  102.         myMember = myRollovermember
  103.         mySprite.member = myMember
  104.       else
  105.         myMember = myStandardMember
  106.         mySprite.member = myMember
  107.       end if
  108.     end if
  109.   end if
  110. end
  111.  
  112. on clickOn me
  113.   myMouseDown = 1
  114.   myMember = myMouseDownMember
  115.   mySprite.member = myMember
  116.   if not voidp(myMouseDownSound) and (myMouseDownSound <> #none) then
  117.     puppetSound(myMouseDownSound)
  118.   end if
  119.   updateStage()
  120. end
  121.  
  122. on Activate me
  123.   myMouseDown = 0
  124.   theMouseWasUp = 0
  125.   myMember = myStandardMember
  126.   mySprite.member = myMember
  127.   if not voidp(myMouseUpSound) and (myMouseUpSound <> #none) then
  128.     puppetSound(myMouseUpSound)
  129.   end if
  130.   updateStage()
  131.   case myMessageType of
  132.     "do":
  133.       do(myMessage)
  134.     "sendAllSprites":
  135.       sendAllSprites(myMessage, me, spriteNum)
  136.     "call the actorList":
  137.       call(myMessage, the actorList, me, spriteNum)
  138.   end case
  139.   call(#PushButton_Activated, mySubscribersList, me, spriteNum, myMessage)
  140. end
  141.  
  142. on Disactivate me
  143.   myMouseDown = 0
  144.   myMember = myStandardMember
  145.   mySprite.member = myMember
  146. end
  147.  
  148. on PushButton_ToggleActive me, trueOrFalse
  149.   if voidp(trueOrFalse) then
  150.     myActiveFlag = not myActiveFlag
  151.   else
  152.     case ilk(trueOrFalse) of
  153.       #integer:
  154.         myActiveFlag = trueOrFalse <> 0
  155.       otherwise:
  156.         return #invalidTypeError
  157.     end case
  158.   end if
  159.   if myActiveFlag then
  160.     myMember = myStandardMember
  161.     mySprite.member = myMember
  162.     call(#PushButton_Enabled, mySubscribersList, me, spriteNum, myMessage)
  163.   else
  164.     myMember = myDisabledMember
  165.     mySprite.member = myMember
  166.     call(#PushButton_Disabled, mySubscribersList, me, spriteNum, myMessage)
  167.   end if
  168. end
  169.  
  170. on PushButton_GetReference me, theList
  171.   case ilk(theList) of
  172.     #list:
  173.       theList.append(me)
  174.     #propList:
  175.       theList.addProp(me.spriteNum, me)
  176.     otherwise:
  177.       return me
  178.   end case
  179.   return theList
  180. end
  181.  
  182. on PushButton_Subscribe me, callingBehavior, theMessage
  183.   if not voidp(theMessage) then
  184.     if theMessage <> myMessage then
  185.       exit
  186.     end if
  187.   end if
  188.   if mySubscribersList.getPos(callingBehavior) then
  189.     exit
  190.   else
  191.     if objectp(callingBehavior) then
  192.       mySubscribersList.append(callingBehavior)
  193.       return me
  194.     end if
  195.   end if
  196. end
  197.  
  198. on PushButton_Unsubscribe me, callingBehavior
  199.   mySubscribersList.deleteOne(callingBehavior)
  200. end
  201.  
  202. on substituteStrings me, parentString, childStringList
  203.   i = childStringList.count()
  204.   repeat while i
  205.     tempString = EMPTY
  206.     dummyString = childStringList.getPropAt(i)
  207.     replacement = childStringList[i]
  208.     lengthAdjust = dummyString.char.count - 1
  209.     repeat while 1
  210.       position = offset(dummyString, parentString)
  211.       if not position then
  212.         parentString = tempString & parentString
  213.         exit repeat
  214.         next repeat
  215.       end if
  216.       if position <> 1 then
  217.         tempString = tempString & parentString.char[1..position - 1]
  218.       end if
  219.       tempString = tempString & replacement
  220.       delete parentString.char[1..position + lengthAdjust]
  221.     end repeat
  222.     i = i - 1
  223.   end repeat
  224.   return parentString
  225. end
  226.  
  227. on ErrorAlert me, theError, data
  228.   case theError of
  229.     #spaceInMessage:
  230.       if the runMode = "Author" then
  231.         behaviorName = string(me)
  232.         delete word 1 of behaviorName
  233.         delete char -30001 of behaviorName
  234.         delete char -30001 of behaviorName
  235.         terror1 = "BEHAVIOR ERROR: Frame ^0, Sprite ^1"
  236.         terror1 = substituteStrings(me, terror1, ["^0": the frame, "^1": the currentSpriteNum])
  237.         terror2 = "Behavior ^0"
  238.         terror2 = substituteStrings(me, terror2, ["^0": behaviorName])
  239.         terror3 = "This message includes spaces: ^0"
  240.         terror3 = substituteStrings(me, terror3, ["^0": QUOTE & data & QUOTE])
  241.         terror4 = "Only the first word will be used in sendAllSprite calls."
  242.         alert(terror1 & RETURN & RETURN & terror2 & RETURN & RETURN & terror3 & RETURN & RETURN & terror4)
  243.       end if
  244.   end case
  245. end
  246.  
  247. on isOKToAttach me, aSpriteType, aSpriteNum
  248.   tisok = 0
  249.   if aSpriteType = #graphic then
  250.     if PermittedMemberTypes().getOne(sprite(aSpriteNum).member.type) > 0 then
  251.       tisok = 1
  252.     end if
  253.   end if
  254.   return tisok
  255. end
  256.  
  257. on getPropertyDescriptionList me
  258.   theMember = sprite(the currentSpriteNum).member
  259.   memberType = theMember.type
  260.   permittedTypes = PermittedMemberTypes(me)
  261.   theMemberNum = theMember.number
  262.   suitableMembersList = GetSuitableMembers(me, permittedTypes)
  263.   descriptionList = [#myStandardMember: [#comment: "- GRAPHICS - Standard member for sprite", #format: #member, #range: suitableMembersList, #default: theMember], #myRollovermember: [#comment: "Rollover member", #format: #member, #range: suitableMembersList, #default: member(theMemberNum - 1)], #myMouseDownMember: [#comment: "MouseDown member", #format: #member, #range: suitableMembersList, #default: member(theMemberNum - 2)], #myDisabledMember: [#comment: "Disabled member", #format: #member, #range: suitableMembersList, #default: member(theMemberNum - 1)]]
  264.   soundsAvailable = GetSuitableMembers(me, [#sound])
  265.   if soundsAvailable.count() then
  266.     soundsAvailable.addAt(1, #none)
  267.     descriptionList.addProp(#myMouseDownSound, [#comment: "- SOUNDS - Sound to play on mouseDown", #format: #sound, #range: soundsAvailable, #default: member("click")])
  268.     descriptionList.addProp(#myMouseUpSound, [#comment: "Sound to play on mouseUp", #format: #sound, #range: soundsAvailable, #default: member(theMemberNum + 5)])
  269.   end if
  270.   descriptionList.addProp(#myActiveFlag, [#comment: "- INTERACTION - Button is initially", #format: #string, #range: ["Active", "Inactive"], #default: "Active"])
  271.   descriptionList.addProp(#myXRayFlag, [#comment: "Sprites which cover the button", #format: #string, #range: ["block all mouse events", "let all mouse events through"], #default: 0])
  272.   descriptionList.addProp(#myMessageType, [#comment: "Action on mouseUp", #format: #string, #range: ["do", "sendAllSprites", "call the actorList", "no action"], #default: "sendAllSprites"])
  273.   descriptionList.addProp(#myMessage, [#comment: EMPTY, #format: #string, #default: "YourCustomMessage"])
  274.   return descriptionList
  275. end
  276.  
  277. on GetSuitableMembers me, permittedTypes
  278.   cursor(4)
  279.   suitableMembersList = []
  280.   maxCastLib = the number of castLibs
  281.   repeat with theCastLib = 1 to maxCastLib
  282.     maxMember = the number of castMembers of castLib theCastLib
  283.     repeat with memberNumber = 1 to maxMember
  284.       theMember = member(memberNumber, theCastLib)
  285.       if permittedTypes.getPos(theMember.type) then
  286.         if theMember.name = EMPTY then
  287.           suitableMembersList.append(theMember)
  288.           next repeat
  289.         end if
  290.         suitableMembersList.append(theMember.name)
  291.       end if
  292.     end repeat
  293.   end repeat
  294.   cursor(-1)
  295.   return suitableMembersList
  296. end
  297.  
  298. on PermittedMemberTypes me
  299.   return [#bitmap, #filmLoop, #flash, #movie, #picture, #quickTimeMedia, #shape, #vectorShape]
  300. end
  301.